#ifndef DS18B20_ESWIN_H
#define DS18B20_ESWIN_H

#include <stdint.h>
#include "status.h"
#include "../board/sdk_project_config.h"

// 微秒级延时函数声明
// extern void OS_DelayUs(uint32_t us);

// 宏定义简化引脚操作
#define DS18B20_PORT PORTD
#define DS18B20_PIN  6

// DS18B20 温度数据结构
typedef struct {
    bool is_negative;
    uint16_t temperature_decimal;
    uint16_t temperature_integer; // 温度值(℃)
    bool valid;                  // 数据是否有效
} ds18b20_data_t;

// 错误代码
typedef enum {
    DS18B20_OK = STATUS_SUCCESS,
    DS18B20_ERROR_TIMEOUT,
    DS18B20_ERROR_CHECKSUM,
    DS18B20_ERROR_NO_DEVICE,
    DS18B20_ERROR_CONVERSION
} ds18b20_error_t;

// 分辨率设置
typedef enum {
    DS18B20_RESOLUTION_9BIT  = 0x1F, // 93.75ms转换时间
    DS18B20_RESOLUTION_10BIT = 0x3F, // 187.5ms转换时间
    DS18B20_RESOLUTION_11BIT = 0x5F, // 375ms转换时间
    DS18B20_RESOLUTION_12BIT = 0x7F  // 750ms转换时间
} ds18b20_resolution_t;

/**
 * @brief 初始化DS18B20传感器
 * 
 * 
 * @return status_t 状态码
 */
status_t DS18B20_Init(void);

/**
 * @brief 设置DS18B20分辨率
 * 
 * 
 * @param resolution 分辨率设置
 * @return ds18b20_error_t 错误代码
 */
ds18b20_error_t DS18B20_SetResolution(ds18b20_resolution_t resolution);

/**
 * @brief 读取DS18B20温度数据
 * 
 * 
 * @param data 存储读取结果的结构体指针
 * @return ds18b20_error_t 错误代码
 */
ds18b20_error_t DS18B20_ReadTemperature(ds18b20_data_t *data);

#endif // DS18B20_ESWIN_H

#ifdef EXAMPLE
#include "ds18b20_eswin.h"
#include "stdio.h"

int main(void)
{
    // 初始化DS18B20
    if (DS18B20_Init() != STATUS_SUCCESS) {
        printf("DS18B20 initialization failed!\n");
        return;
    }

    // 设置分辨率为12位
    if (DS18B20_SetResolution(DS18B20_RESOLUTION_12BIT) != DS18B20_OK) {
        printf("Failed to set resolution!\n");
    }

    while (1) {
        ds18b20_data_t data;
        ds18b20_error_t err = DS18B20_ReadTemperature(&data);

        if (err == DS18B20_OK && data.valid) {
            printf("Temperature: %.2f°C\n", data.temperature);
        } else {
            printf("DS18B20 read error: ");
            switch (err) {
            case DS18B20_ERROR_TIMEOUT:
                printf("Timeout\n");
                break;
            case DS18B20_ERROR_CHECKSUM:
                printf("Checksum error\n");
                break;
            case DS18B20_ERROR_NO_DEVICE:
                printf("No device detected\n");
                break;
            case DS18B20_ERROR_CONVERSION:
                printf("Conversion timeout\n");
                break;
            default:
                printf("Unknown error\n");
            }
        }

        OS_DelayMs(1000); // 每秒读取一次
    }
}
#endif